﻿using System;
using System.Collections.Generic;
using System.Data;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    public class DAOSiniestroMySql:ConexionBaseDatos, IDAOSiniestro
    {
        public int AgregarSiniestro(Siniestro siniestro)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "AgregarSiniestro";

                comando.Parameters.AddWithValue("@idPoliza",siniestro.Poliza.Id);
                comando.Parameters.AddWithValue("@idRamo",siniestro.Ramo.Id);
                comando.Parameters.AddWithValue("@numeroReferencia", siniestro.NumeroReferencia);
                comando.Parameters.AddWithValue("@numeroSiniestro", siniestro.NumeroSiniestro);
                comando.Parameters.AddWithValue("@fechaOcurrencia", siniestro.FechaOcurrencia);
                comando.Parameters.AddWithValue("@fechaNotificacion", siniestro.FechaNotificacion);
                comando.Parameters.AddWithValue("@idLugar", siniestro.Lugar.Id);
                comando.Parameters.AddWithValue("@monto", siniestro.MontoEstimado);

                comando.Parameters["@idPoliza"].Direction = ParameterDirection.Input;
                comando.Parameters["@idRamo"].Direction = ParameterDirection.Input;
                comando.Parameters["@numeroReferencia"].Direction = ParameterDirection.Input;
                comando.Parameters["@numeroSiniestro"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaOcurrencia"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaNotificacion"].Direction = ParameterDirection.Input;
                comando.Parameters["@idLugar"].Direction = ParameterDirection.Input;
                comando.Parameters["@monto"].Direction = ParameterDirection.Input;
                int id = 0;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                CerrarConexion();
                return id;
            }
            catch (Exception)
            {

                return -1;
            }
        }

        public bool EditarSiniestro(Siniestro siniestro)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "EditarSiniestro";


                comando.Parameters.AddWithValue("@idPoliza", siniestro.Poliza.Id);
                comando.Parameters.AddWithValue("@idRamo", siniestro.Ramo.Id);
                comando.Parameters.AddWithValue("@numeroReferencia", siniestro.NumeroReferencia);
                comando.Parameters.AddWithValue("@numeroSiniestro", siniestro.NumeroSiniestro);
                comando.Parameters.AddWithValue("@fechaOcurrencia", siniestro.FechaOcurrencia);
                comando.Parameters.AddWithValue("@fechaNotificacion", siniestro.FechaNotificacion);
                comando.Parameters.AddWithValue("@idLugar", siniestro.Lugar.Id);
                comando.Parameters.AddWithValue("@monto", siniestro.MontoEstimado);
                comando.Parameters.AddWithValue("@idSiniestro", siniestro.Id);

                comando.Parameters["@idPoliza"].Direction = ParameterDirection.Input;
                comando.Parameters["@idRamo"].Direction = ParameterDirection.Input;
                comando.Parameters["@numeroReferencia"].Direction = ParameterDirection.Input;
                comando.Parameters["@numeroSiniestro"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaOcurrencia"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaNotificacion"].Direction = ParameterDirection.Input;
                comando.Parameters["@idLugar"].Direction = ParameterDirection.Input;
                comando.Parameters["@monto"].Direction = ParameterDirection.Input;
                comando.Parameters["@idSiniestro"].Direction = ParameterDirection.Input;
                comando.ExecuteNonQuery();

                CerrarConexion();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }

        public bool EliminarSiniestro(Siniestro siniestro)
        {
            throw new NotImplementedException();
        }

        public List<Siniestro> ObtenerSiniestroAjustadora(Entidad aseguradora)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Siniestro> retorno = new List<Siniestro>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerSiniestroAjustadora";

                comando.Parameters.AddWithValue("@idAseguradora", aseguradora.Id);
                comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Siniestro miSiniestro = FabricaEntidades.ObtenerSiniestro();

                    miSiniestro.Id = (int) reader[0];
                    miSiniestro.Poliza.Id = (int) reader[1];
                    miSiniestro.Ramo.Id = (int) reader[2];
                    miSiniestro.NumeroReferencia = (int) reader[3];
                    miSiniestro.NumeroSiniestro = (int) reader[4];  
                    miSiniestro.MontoEstimado = (float) reader[5];
                    miSiniestro.FechaOcurrencia = (DateTime) reader[6];
                    miSiniestro.FechaNotificacion = (DateTime) reader[7];
                    miSiniestro.Lugar.Id = (int) reader[8];
                    
                    retorno.Add(miSiniestro);

                }

                reader.Close();
                CerrarConexion();
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
        }

        public List<Siniestro> ObtenerSiniestroCliente(Entidad cliente)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Siniestro> retorno = new List<Siniestro>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerSiniestroCliente";

                comando.Parameters.AddWithValue("@idCliente", cliente.Id);
                comando.Parameters["@idCliente"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Siniestro miSiniestro = FabricaEntidades.ObtenerSiniestro();

                    miSiniestro.Id = (int)reader[0];
                    miSiniestro.Poliza.Id = (int)reader[1];
                    miSiniestro.Ramo.Id = (int)reader[2];
                    miSiniestro.NumeroReferencia = (int)reader[3];
                    miSiniestro.NumeroSiniestro = (int)reader[4];
                    miSiniestro.MontoEstimado = (float)reader[5];
                    miSiniestro.FechaOcurrencia = (DateTime)reader[6];
                    miSiniestro.FechaNotificacion = (DateTime)reader[7];
                    miSiniestro.Lugar.Id = (int)reader[8];

                    retorno.Add(miSiniestro);

                }

                reader.Close();
                CerrarConexion();
                return retorno;
            }
            catch (Exception)
            {

                return null;
            }
        }

        /// <summary>
        /// Obtiene el numero de la referencia del siniestro
        /// </summary>
        /// <returns>entero con el numero de referencia</returns>
        public int ObtenerReferencia()
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                int numero = 0;
        
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerReferenciaSiniestro";
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    numero = (int) reader[0];
                }

                reader.Close();
                CerrarConexion();
                return numero;
            }
            catch (Exception)
            {
                return -1;
            }
        }
    }
}
